再利用される Cell に UIControl があるときはちゃんと Action, Target を削除しよう
UICollectionViewCell
のように再利用されるものに、ボタンのような UIControl
を配置して addAction
/ addTarget
している際は、前のを削除しよう。
最近だと addAction
で UIAction
を追加することが多いだろうが、その場合は以下のような extension を用意しておくと削除が楽。
こういうったものを prepareForReuse
で呼び出しておく。
extension UIControl {
public func removeAllActions() {
enumerateEventHandlers { action, _, event, _ in
if let action = action {
removeAction(action, for: event)
}
}
}
}
具体的にどんなことに困ったか
Bunpo でクイズの画面を UICollectionViewCell
で作っているが、選択肢のボタンに対して「タップした際に正解・不正解に応じた見た目に変化する」Action を追加していた。
これが再利用されたときに、前の Action が残っていて、正解なのに一瞬だけ不正解の表示がちらっと見えていた。